<?php
/**
* Класс-модель профиля пользователя
* 
* @author GhostCPP <ghostcpp@gmail.com>
*/
class UserForm extends AccountPending
{
    /**
    * Старый пароль при смене пароля
    */
    public $oldPassword;
    /**
    * Новый пароль при смене пароля
    */
    public $newPassword;
    /**
    * Подтверждение нового пароля при смене пароля
    */
    public $confirmPassword;
    /**
    * Пол
    */
    const GENDER_UNDEFINED = 0; 
    const GENDER_MALE = 1; 
    const GENDER_FEMALE = 2; 
    
    public static function model($className = __CLASS__)
    {
        return parent::model($className);
    }
    
    /**
    * Правила валидации
    */
    public function rules()
    {
        return array(
            // старый пароль
            array('oldPassword', 'required', 'message' => Yii::t('models','Вы не ввели старый пароль'), 'on' => 'change_password'),
            array('oldPassword', 'length', 'min' => 5, 'max' => 20, 'tooShort' => Yii::t('models','Новый пароль должен быть длинной от 5 до 20 символов'), 'tooLong' => Yii::t('models','Новый пароль должен быть длинной от 5 до 20 символов'), 'on' => 'change_password'),
            array('oldPassword', 'match', 'pattern' => '/^[A-z0-9_-\s]+$/u', 'message' => Yii::t('models','Вы ввели неккоректный старый пароль. Используйте только латинские буквы, цифры а также символы _ и - '), 'on' => 'change_password'),
            array('oldPassword', 'validatorCheckPassword', 'on' => 'change_password'),
            // новый пароль
            array('newPassword', 'required', 'message' => Yii::t('models','Вы не ввели новый пароль'), 'on' => 'change_password'),
            array('newPassword', 'length', 'min' => 5, 'max' => 20, 'tooShort' => Yii::t('models','Новый пароль должен быть длиной от 5 до 20 символов'), 'tooLong' => Yii::t('models','Новый пароль должен быть длиной от 5 до 20 символов'), 'on' => 'change_password'),
            array('newPassword', 'match', 'pattern' => '/^[A-z0-9-_\s]+$/u', 'message' => Yii::t('models','Вы ввели неккоректный новый пароль. Используйте только латинские буквы, цифры а также символы _ и - '), 'on' => 'change_password'),
            // повторение пароля
            array('confirmPassword', 'required', 'message' => Yii::t('models','Вы не ввели подтверждение пароля'), 'on' => 'change_password'),
            array('confirmPassword', 'compare', 'compareAttribute' => 'newPassword', 'message' => Yii::t('models','Вы не смогли повторить новый пароль'), 'on' => 'change_password'),
            // адрес электронной почты (E-mail)
            array('email', 'required', 'message' => Yii::t('models','Вы не ввели адрес элекронной почты'), 'on' => 'change_email'),
            array('email', 'email', 'message' => Yii::t('models','Вы ввели неккоректный адрес электронной почты'), 'on' => 'change_email'),
            array('email', 'unique', 'message' => Yii::t('models','Введеный адрес электронной почты уже используется'), 'on' => 'change_email'),
            // реальное имя
            array('truename', 'match', 'pattern' => '/^[А-яA-z-\s]+$/u', 'message' => Yii::t('models','Вы ввели некорректное настоящее имя. Используйте только буквы русского и латинского алфавитов, а также символ -'), 'on' => 'edit_profile'),
            // страна
            array('country', 'match', 'pattern' => '/^[А-яA-z-\s]+$/u', 'message' => Yii::t('models','Название страны содержит недопустимые символы. Используйте только буквы русского и латинского алфавитов, а также символ -'), 'on' => 'edit_profile'),
            // пол
            array('gender', 'in', 'range' => array(self::GENDER_UNDEFINED, self::GENDER_MALE, self::GENDER_FEMALE), 'message' => 'Вы не указали свой пол', 'on' => 'edit_profile'),
        );
    }
    
    /**
    * Возвращает массив меток формы
    */
    public function attributeLabels()
    {
        return array(
            'oldPassword' => Yii::t('models', 'Старый пароль'),
            'newPassword' => Yii::t('models','Новый пароль'),
            'confirmPassword' => Yii::t('models','Повторите новый пароль'),
            'email' => Yii::t('models','Адрес электронной почты'),
            'truename' => Yii::t('models','Настоящее имя'),
            'country' => Yii::t('models','Страна'),
            'gender' => Yii::t('models','Пол'),
        );
    }
    
    /**
    * Метод используется как правило валидации формы
    * проверят новый и старый пароли
    */
    public function validatorCheckPassword()
    {
        if($this->hasErrors('oldPassword') == false)
        {
            if($this->password != sha1(sha1($this->oldPassword)))
            {
                $this->addError('oldPassword', Yii::t('models','Вы ввели неверный старый пароль'));
                return;
            }
        }
        
        if($this->hasErrors('oldPassword') == false)
        {
            if(sha1(sha1($this->newPassword)) == sha1(sha1($this->oldPassword)))
            {
               $this->addError('oldPassword', Yii::t('models','Ваш старый пароль совпадает с новым паролем')); 
               return;
            }            
        }   
        
        if($this->hasErrors('newPassword') == false)
        {
            if($this->newPassword == $this->name)
            {
                $this->addError('newPassword', Yii::t('models','Ваш новый пароль не может совпадать с логином'));
                return;
            }
        } 
    }
    
    /**
    * Метод класса для смены пароля
    */
    public function ChangePassword()
    {
        return $this->saveAttributes(array('password'));
    }
    
    /**
    * Метод класса для смены адреса электронной почты
    */
    public function ChangeEmail()
    {
        return $this->saveAttributes(array('email'));
    }
    
    /**
    * Метод класса для сохранения данных профиля
    */
    public function saveProfile()
    {
        return $this->saveAttributes(array('truename', 'country', 'gender'));
    }
    
    /**
    * Возвращает данные для поля select выбора поля пользователя
    * @return array массив с данными
    */
    public function getGenderOptions()
    {
        return array(
            self::GENDER_UNDEFINED => Yii::t('models','Не указывать'),
            self::GENDER_MALE => Yii::t('models','Мужчина'),
            self::GENDER_FEMALE => Yii::t('models','Женщина'),
        );
    } 
    
    /**
    * Событие вызывается после валидации
    */
    protected function afterValidate()
    {
        if(parent::afterValidate())
        {
            if($this->scenario == 'change_password')
            {
                $this->password = sha1(sha1($this->newPassword));
                return true;
            }
        }
        return false;        
    }    
}
?>
